Python之Html解析方法(beautiful soup)
Python之Html解析方法(beautiful soup)
BeautifulSoup的安装及介绍
官方给出的几点介绍:
Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
Beautiful Soup自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。
Beautiful Soup已成为和lxml、html6lib一样出色的python解释器,为用户灵活地提供不同的解析策略或强劲的速度。
Beautiful Soup的安装
1 | pip install beautifulsoup4 |
BeautifulSoup中的HTML解析器对比
解析器 | 使用方法 | 优势 | 劣势 |
---|---|---|---|
Python 标准库 |
BeautifulSoup(markup, “html.parser”) |
Python 的内置标准库;执行速度适中;文档容错能力强 |
Python 2.7.3 or 3.2.2 )前 的版本中文档容错能力差 |
lxml HTML 解析器 |
BeautifulSoup(markup, “lxml”) |
速度快;文档容错能力强 | 需要安装C 语言库 |
lxml XML 解析器 |
BeautifulSoup(markup, [“lxml”, “xml”]) |
速度快;唯一支持XML 的解析器 |
需要安装C 语言库 |
html5lib |
BeautifulSoup(markup, “html5lib”) |
最好的容错性;以浏览器的方式解析文档;生成HTML5 格式的文档 |
速度慢;不依赖外部扩展 |
BeautifulSoup是一个可以从html或xml文件中提取数据的Python库。它能够通过你喜欢的转换器实现惯用的文档导航、查找、修改文档的方式。在Python开发中,主要用的是BeautifulSoup的查找提取功能,修改功能很少使用
1 | 1、安装BeautifulSoup |
BeautifulSoup的使用:
1、导入bs4库
1 | from bs4 import BeautifulSoup #导入bs4库 |
2、创建包含html代码的字符串
1 | html_str = """ |
3、创建BeautifulSoup对象
(1)直接通过字符串方式创建
1 | soup = BeautifulSoup(html_str,'lxml') #html.parser是解析器,也可是lxml |
(2)通过已有的文件来创建
1 | soup = BeautifulSoup(open('/home/index.html'),features='html.parser')#html.parser是解析器,也可是lxml |
4、BeautifulSoup对象的种类:BeautifulSoup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象
(1)BeautifulSoup:表示的是一个文档的全部内容。大部分时候,可以把它当作Tag对象,是一个特殊的Tag,因为BeautifulSoup对象并不是真正的HTML和XML,所以没有name和attribute属性
(2)Tag:与XML或HTML原生文档中的Tag相同,通俗讲就是标记
如:
抽取title:print(soup.title)
抽取a : print(soup.a)
抽取p:print(soup.p)
Tag中有两个重要的属性:name和attributes。每个Tag都有自己的名字,通过.name来获取
print(soup.title.name)
操作Tag属性的方法和操作字典相同
如:
Hello World
print(soup.p[‘class’])
也可以直接“点”取属性,如 .attrs 获取Tag中所有属性
print(soup.p.attrs)
(3)NavigableString:获取标记内部的文字.string
BeautifulSoup用 NavigableString类来封装Tag中的字符串,一个 NavigableString字符串与Python中的Unicode字符串相同,通过unicode()方法可以直接将 NavigableString对象转换成Unicode字符串
如:u_string = unicode(soup.p.string)
(4)Comment:对于一些特殊对象,如果不清楚这个标记.string的情况下,可能造成数据提取混乱。因此在提取字符串时,可以判断下类型:
if type(soup.a.string) == bs4.element.Comment:
print(soup.a.string)
5、遍历文档
(1)子节点:
A、对于直接子节点可以通过 .contents 和 .children来访问
.contents —->将Tag子节点以列表的方式输出
print(soup.head.contents)
.children —–>返回一个生成器,对Tag子节点进行循环
for child in soup.head.children:
print(child)
B、获取子节点的内容
.string —> 如果标记里没有标记了,则返回内容;如果标记里只有一个唯一的标记,则返回最里面的内容;如果包含多个子节点,Tag无法确定.string方法应该返回哪个时,则返回None
.strings —->主要应用于Tag中包含多个字符串的情况,可以进行循环遍历
for str in soup.strings:
print(repr(str))
.stripped_string —–>可以去掉字符串中包含的空格或空行
for str in soup.stripped_strings:
print(repr(str))
(2)父节点
A、通过.parent属性来获取某个元素的父节点,如:
print(soup.title.parent)
B、通过.parents属性可以递归得到元素的所有父辈节点
for parent in soup.a.parents:
if parent is None:
print(parent)
else:
print(parent.name)
(3)兄弟节点
. next_sibling —–>获取该节点的下一个兄弟节点
. previous_sibling —–>获取该节点的上一个兄弟节点
(4)前后节点
. next_elements —–>获得该节点前面的所有节点
. previous_elements —–>获得该节点后面的所有节点
6、搜索文档树
(1)find_all(name,attrs,recursive,text,**kwargs)
A、name参数:查找名字为name的标记
print(soup.find_all(‘‘’’b))
B、text参数:查找文档中字符串的内容
C、 recursive参数:检索当前Tag的所有子孙节点时,若只想找直接子节点, 该参数设置为False
7、CSS选择器:使用soup.select()函数
(1)通过标记名查找
print(soup.select(“title”))
(2)通过Tag的class属性值查找
print(soup.select(“.sister”))
(3)通过Tag的id属性值查找
print(soup.select(“#sister”))
(4)通过是否存在某个属性查找
print(soup.select(“a[href]”))
(5)通过属性值查找
print(soup.select(‘a[href=”http://exam.com"]'))
参考链接:
https://www.cnblogs.com/lone5wolf/p/10881395.html
https://blog.csdn.net/IMW_MG/article/details/78220979
Ursprünglicher Autor: Bean
Ursprünglicher Link: http://yoursite.com/2020/02/09/Python之Html解析方法(beautiful soup)/
Copyright-Erklärung: Bitte geben Sie die Quelle des Nachdrucks an.